#!/bin/bash

# FastAPI开发环境启动脚本
# 使用方法: ./scripts/dev.sh [命令]
# 命令选项: start, stop, logs, test, lint, format, clean

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 项目根目录
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$PROJECT_ROOT"

# 检查uv是否安装
if ! command -v uv &> /dev/null; then
    log_error "uv 未安装，请先安装 uv"
    log_info "安装命令: curl -LsSf https://astral.sh/uv/install.sh | sh"
    exit 1
fi

# 检查环境变量文件
if [[ ! -f ".env" ]]; then
    if [[ -f ".env.example" ]]; then
        log_warning ".env 文件不存在，从 .env.example 复制"
        cp .env.example .env
        log_warning "请编辑 .env 文件并设置正确的环境变量"
    else
        log_error ".env 和 .env.example 文件都不存在"
        exit 1
    fi
fi

# 函数定义
start_dev() {
    log_info "启动开发环境..."
    
    # 安装依赖
    log_info "安装依赖..."
    uv sync --extra dev
    
    # 创建日志目录
    mkdir -p logs
    
    # 启动应用
    log_success "启动FastAPI应用..."
    log_info "应用地址: http://localhost:8088"
log_info "API文档: http://localhost:8088/docs"
    log_info "按 Ctrl+C 停止应用"
    
    uv run uvicorn main:app --reload --host 0.0.0.0 --port 8088
}

stop_dev() {
    log_info "停止开发环境..."
    
    # 杀死可能残留的进程
    pkill -f "uvicorn main:app" || true
    
    log_success "开发环境已停止"
}

show_logs() {
    log_info "显示应用日志..."
    if [[ -f "logs/app.log" ]]; then
        tail -f logs/app.log
    else
        log_warning "日志文件不存在: logs/app.log"
    fi
}

run_tests() {
    log_info "运行测试..."
    
    # 确保测试依赖已安装
    uv sync --extra dev
    
    # 运行测试
    uv run pytest -v --cov=src --cov-report=term-missing
    
    log_success "测试完成"
}

run_lint() {
    log_info "运行代码检查..."
    
    # 确保开发依赖已安装
    uv sync --extra dev
    
    # 运行flake8
    log_info "运行 flake8..."
    uv run flake8 src tests
    
    # 运行mypy
    log_info "运行 mypy..."
    uv run mypy src
    
    log_success "代码检查完成"
}

format_code() {
    log_info "格式化代码..."
    
    # 确保开发依赖已安装
    uv sync --extra dev
    
    # 运行black
    log_info "运行 black..."
    uv run black src tests
    
    # 运行isort
    log_info "运行 isort..."
    uv run isort src tests
    
    log_success "代码格式化完成"
}

clean_env() {
    log_info "清理环境..."
    
    # 清理Python缓存
    find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
    find . -type f -name "*.pyc" -delete 2>/dev/null || true
    find . -type d -name ".pytest_cache" -exec rm -rf {} + 2>/dev/null || true
    find . -type d -name ".mypy_cache" -exec rm -rf {} + 2>/dev/null || true
    
    # 清理日志文件
    rm -f logs/*.log* 2>/dev/null || true
    
    log_success "环境清理完成"
}

show_help() {
    echo "FastAPI开发环境管理脚本"
    echo ""
    echo "使用方法: $0 [命令]"
    echo ""
    echo "可用命令:"
    echo "  start    - 启动开发环境"
    echo "  stop     - 停止开发环境"
    echo "  logs     - 查看应用日志"
    echo "  test     - 运行测试"
    echo "  lint     - 运行代码检查"
    echo "  format   - 格式化代码"
    echo "  clean    - 清理环境"
    echo "  help     - 显示帮助信息"
    echo ""
    echo "示例:"
    echo "  $0 start    # 启动开发环境"
    echo "  $0 test     # 运行测试"
    echo "  $0 format   # 格式化代码"
}

# 主逻辑
COMMAND=${1:-start}

case $COMMAND in
    start)
        start_dev
        ;;
    stop)
        stop_dev
        ;;
    logs)
        show_logs
        ;;
    test)
        run_tests
        ;;
    lint)
        run_lint
        ;;
    format)
        format_code
        ;;
    clean)
        clean_env
        ;;
    help|--help|-h)
        show_help
        ;;
    *)
        log_error "未知命令: $COMMAND"
        show_help
        exit 1
        ;;
esac